<html>
<head>
<meta charset="UTF-8">
<title>KBEngine - KBEngine cell 文档</title>
<link href="../../style.css" rel="stylesheet" type="text/css">
</head>
<body>
<table width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><td align=left style="background:#708090"> <font size=15 color=#ffffff> KBEngine </font></td></tr>
</table> <hr>
<h1>KBEngine模块</h1>
<a href="KBEngine.html">KBEngine</a>模块提供了Python脚本访问<a href="../Classes/Entity.html">实体</a>的部分，特别是它提供了定时器的注册与移除，
以及<a href="../Classes/Entity.html">实体</a>的创建。
<h2><a href="#" onClick="obj=document.getElementById( 'classes' );vis = (obj.style.display == 'none') ? 'block' : 'none'; obj.style.display = vis; return false;" class="h2">类</a></h2>
<table id="classes" cellpadding=0 cellspacing=3 style="margin-left: 20px;">

<tr><td>
<span class="class_list"><a href="../Classes/Entity.html" class="class_list" >Entity</a></span>
</td></tr>

</table>

<h2><a href="#" onClick="obj=document.getElementById( 'functions' );vis = (obj.style.display == 'none') ? 'block' : 'none'; obj.style.display = vis; return false;" class="h2">成员函数</a></h2>
<table id="functions" cellpadding=0 cellspacing=3 style="margin-left: 20px;">

<tr><td>
<span class="function_list">def <a href="#addSpaceGeometryMapping" class="function_list" >addSpaceGeometryMapping</a>( spaceID, mapper, path, shouldLoadOnServer, params ):</span>
</td></tr>

<tr><td>
<span class="function_list">def <a href="#addWatcher" class="function_list" >addWatcher</a>( path, dataType, getFunction ):</span>
</td></tr>

<tr><td>
<span class="function_list">def <a href="#address" class="function_list" >address</a>(  ):</span>
</td></tr>

<tr><td>
<span class="function_list">def <a href="#MemoryStream" class="function_list" >MemoryStream</a>(  ):</span>
</td></tr>

<tr><td>
<span class="function_list">def <a href="#createEntity" class="function_list" >createEntity</a>( entityType, spaceID, position, direction, params ):</span>
</td></tr>

<tr><td>
<span class="function_list">def <a href="#debugTracing" class="function_list" >debugTracing</a>(  ):</span>
</td></tr>

<tr><td>
<span class="function_list">def <a href="#delSpaceData" class="function_list" >delSpaceData</a>( spaceID, key ):</span>
</td></tr>

<tr><td>
<span class="function_list">def <a href="#delWatcher" class="function_list" >delWatcher</a>( path ):</span>
</td></tr>

<tr><td>
<span class="function_list">def <a href="#deregisterReadFileDescriptor" class="function_list" >deregisterReadFileDescriptor</a>( fileDescriptor ):</span>
</td></tr>

<tr><td>
<span class="function_list">def <a href="#deregisterWriteFileDescriptor" class="function_list" >deregisterWriteFileDescriptor</a>( fileDescriptor ):</span>
</td></tr>

<tr><td>
<span class="function_list">def <a href="#executeRawDatabaseCommand" class="function_list" >executeRawDatabaseCommand</a>( command, callback, threadID, dbInterfaceName ):</span>
</td></tr>

<tr><td>
<span class="function_list">def <a href="#genUUID64" class="function_list" >genUUID64</a>(  ):</span>
</td></tr>

<tr><td>
<span class="function_list">def <a href="#getResFullPath" class="function_list" >getResFullPath</a>( res ):</span>
</td></tr>

<tr><td>
<span class="function_list">def <a href="#getSpaceData" class="function_list" >getSpaceData</a>( spaceID, key ):</span>
</td></tr>

<tr><td>
<span class="function_list">def <a href="#getSpaceGeometryMapping" class="function_list" >getSpaceGeometryMapping</a>( spaceID ):</span>
</td></tr>

<tr><td>
<span class="function_list">def <a href="#getWatcher" class="function_list" >getWatcher</a>( path ):</span>
</td></tr>

<tr><td>
<span class="function_list">def <a href="#getWatcherDir" class="function_list" >getWatcherDir</a>( path ):</span>
</td></tr>

<tr><td>
<span class="function_list">def <a href="#getAppFlags" class="function_list" >getAppFlags</a>( ):</span>
</td></tr>

<tr><td>
<span class="function_list">def <a href="#hasRes" class="function_list" >hasRes</a>( res ):</span>
</td></tr>

<tr><td>
<span class="function_list">def <a href="#isShuttingDown" class="function_list" >isShuttingDown</a>(  ):</span>
</td></tr>

<tr><td>
<span class="function_list">def <a href="#listPathRes" class="function_list" >listPathRes</a>( path, extension ):</span>
</td></tr>

<tr><td>
<span class="function_list">def <a href="#matchPath" class="function_list" >matchPath</a>( res ):</span>
</td></tr>

<tr><td>
<span class="function_list">def <a href="#open" class="function_list" >open</a>( res, mode, encoding ):</span>
</td></tr>

<tr><td>
<span class="function_list">def <a href="#publish" class="function_list" >publish</a>(  ):</span>
</td></tr>

<tr><td>
<span class="function_list">def <a href="#registerReadFileDescriptor" class="function_list" >registerReadFileDescriptor</a>( fileDescriptor, callback ):</span>
</td></tr>

<tr><td>
<span class="function_list">def <a href="#registerWriteFileDescriptor" class="function_list" >registerWriteFileDescriptor</a>( fileDescriptor, callback ):</span>
</td></tr>

<tr><td>
<span class="function_list">def <a href="#raycast" class="function_list" >raycast</a>( spaceID, layer, src, dst ):</span>
</td></tr>

<tr><td>
<span class="function_list">def <a href="#reloadScript" class="function_list" >reloadScript</a>( fullReload ):</span>
</td></tr>

<tr><td>
<span class="function_list">def <a href="#scriptLogType" class="function_list" >scriptLogType</a>( logType ):</span>
</td></tr>

<tr><td>
<span class="function_list">def <a href="#setAppFlags" class="function_list" >setAppFlags</a>( flags ):</span>
</td></tr>

<tr><td>
<span class="function_list">def <a href="#setSpaceData" class="function_list" >setSpaceData</a>( spaceID, key, value ):</span>
</td></tr>

<tr><td>
<span class="function_list">def <a href="#time" class="function_list" >time</a>(  ):</span>
</td></tr>

<tr><td>
<span class="function_list">def <a href="#urlopen" class="function_list" >urlopen</a>( url, callback, postData, headers ):</span>
</td></tr>

</table>

<h2><a href="#" onClick="obj=document.getElementById( 'callbacks' );vis = (obj.style.display == 'none') ? 'block' : 'none'; obj.style.display = vis; return false;" class="h2">回调函数</a></h2>
<table id="callbacks" cellpadding=0 cellspacing=3 style="margin-left: 20px;">

<tr><td>
<span class="function_list">def <a href="#onCellAppData" class="function_list" >onCellAppData</a>( key, value ):</span>
</td></tr>

<tr><td>
<span class="function_list">def <a href="#onCellAppDataDel" class="function_list" >onCellAppDataDel</a>( key ):</span>
</td></tr>

<tr><td>
<span class="function_list">def <a href="#onGlobalData" class="function_list" >onGlobalData</a>( key, value ):</span>
</td></tr>

<tr><td>
<span class="function_list">def <a href="#onGlobalDataDel" class="function_list" >onGlobalDataDel</a>( key ):</span>
</td></tr>

<tr><td>
<span class="function_list">def <a href="#onInit" class="function_list" >onInit</a>( isReload ):</span>
</td></tr>

<tr><td>
<span class="function_list">def <a href="#onSpaceData" class="function_list" >onSpaceData</a>( spaceID, key, value ):</span>
</td></tr>

<tr><td>
<span class="function_list">def <a href="#onSpaceGeometryLoaded" class="function_list" >onSpaceGeometryLoaded</a>( spaceID, mapping ):</span>
</td></tr>

<tr><td>
<span class="function_list">def <a href="#onAllSpaceGeometryLoaded" class="function_list" >onAllSpaceGeometryLoaded</a>( spaceID, isBootstrap, mapping ):</span>
</td></tr>

<tr><td>
<span class="function_list">def <a href="#onReadyForLogin" class="function_list" >onReadyForLogin</a>( isBootstrap ):</span>
</td></tr>
</table>

<h2><a href="#" onClick="obj=document.getElementById( 'attributes' );vis = (obj.style.display == 'none') ? 'block' : 'none'; obj.style.display = vis; return false;" class="h2">属性</a></h2>
<table id="attributes" cellpadding=0 cellspacing=3 style="margin-left: 20px;">

<tr valign=top><td><a href="#LOG_TYPE_DBG" class="attribute_list" >LOG_TYPE_DBG</a></td><td>&nbsp; </td></tr>

<tr valign=top><td><a href="#LOG_TYPE_ERR" class="attribute_list" >LOG_TYPE_ERR</a></td><td>&nbsp; </td></tr>

<tr valign=top><td><a href="#LOG_TYPE_INFO" class="attribute_list" >LOG_TYPE_INFO</a></td><td>&nbsp; </td></tr>

<tr valign=top><td><a href="#LOG_TYPE_NORMAL" class="attribute_list" >LOG_TYPE_NORMAL</a></td><td>&nbsp; </td></tr>

<tr valign=top><td><a href="#LOG_TYPE_WAR" class="attribute_list" >LOG_TYPE_WAR</a></td><td>&nbsp; </td></tr>

<tr valign=top><td><a href="#NEXT_ONLY" class="attribute_list" >NEXT_ONLY</a></td><td>&nbsp; </td></tr>

<tr valign=top><td><a href="#cellAppData" class="attribute_list" >cellAppData</a></td><td>&nbsp; </td></tr>

<tr valign=top><td><a href="#component" class="attribute_list" >component</a></td><td>&nbsp; 只读 <a href="STRING.html">string</a></td></tr>

<tr valign=top><td><a href="#entities" class="attribute_list" >entities</a></td><td>&nbsp; <a href="Entities.html">Entities</a>
</td></tr>

<tr valign=top><td><a href="#globalData" class="attribute_list" >globalData</a></td><td>&nbsp; GlobalDataClient</td></tr>

</table>

<hr>
<h2>成员函数文档</h2>

<a name="addSpaceGeometryMapping"></a><p class="function_definition">
<span class="function_definition">def addSpaceGeometryMapping( <i>spaceID, mapper, path, shouldLoadOnServer, params</i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
关联一个给定空间的几何映射，函数调用之后服务端和客户端都会加载相应的几何体数据。<br>
<br><br>
在服务端上，从给定目录里加载所有的几何数据到指定的空间。这些数据可能被分成很多区块，不同区块是异步加载的，当所有的几何数据加载
完成的时候下面的通知方法会被调用：
<pre>	def onAllSpaceGeometryLoaded( self, spaceID, mappingName ):
</pre>
<br>

服务端仅加载场景的几何数据提供给导航和碰撞功能使用，客户端除了几何数据外还会加载纹理等数据。
<br>
3D场景当前默认使用的是recastnavigation插件所导出的数据，2D场景当前默认使用的是MapEditor编辑器导出的数据。

<br><br>
有一种可能会导致onAllSpaceGeometryLoaded()不被调用，就是如果在某一个
时刻多个CellApp同时调用这个方法来添加几何到相同的空间的时候CellAppMgr崩溃了。

<p>
<span class="function_parameter">参数：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">

<tr valign=top><td><span class="function_parameter_name"><i>spaceID</i></span></td><td><span class="function_parameter_description">
uint32，空间的ID，指定在哪个空间操作
</span></td></tr>

<tr valign=top><td><span class="function_parameter_name"><i>mapper</i></span></td><td><span class="function_parameter_description">
目前填None
</span></td></tr>

<tr valign=top><td><span class="function_parameter_name"><i>path</i></span></td><td><span class="function_parameter_description">
包含几何数据的目录路径
</span></td></tr>

<tr valign=top><td><span class="function_parameter_name"><i>shouldLoadOnServer</i></span></td><td><span class="function_parameter_description">
可选的boolean参数，指定是否在服务端上加载几何。默认为True
</span></td></tr>

<tr valign=top><td><span class="function_parameter_name"><i>params</i></span></td><td><span class="function_parameter_description">
可选的PyDict参数，指定不同layer所使用的navmesh，例如：<br>
KBEngine.addSpaceGeometryMapping(self.spaceID, None, resPath, True, {0 : "srv_xinshoucun_1.navmesh", 1 : "srv_xinshoucun.navmesh"})
</span></td></tr>

</table>
</p>

<a name="addWatcher"></a><p class="function_definition">
<span class="function_definition">def addWatcher( <i>path, dataType, getFunction</i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
与调试监视系统交互，允许用户向监视系统注册一个监视变量。
<br><br>
例：
<br>

<pre>
>>> def countPlayers( ):
>>>     i = 0
>>>     for e in KBEngine.entities.values():
>>>     	if e.__class__.__name__ == "Avatar":
>>>     		i += 1
>>>     return i
>>>
>>> <a href="KBEngine.html">KBEngine</a>.<a href=KBEngine.html#addWatcher>addWatcher</a>( "players", "UINT32", countPlayers )
</pre>
<br><br>
这个函数添加一个监视变量在"scripts/players"监视路径之下。函数countPlayers在观察者观察时被调用。
</div>

<p>
<span class="function_parameter">参数：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">

<tr valign=top><td><span class="function_parameter_name"><i>path</i></span></td><td><span class="function_parameter_description">
创建监视的路径。
</span></td></tr>

<tr valign=top><td><span class="function_parameter_name"><i>dataType</i></span></td><td><span class="function_parameter_description">
监视变量的值类型。参考: <a href=../../basetypes.html>基本类型</a>
</span></td></tr>

<tr valign=top><td><span class="function_parameter_name"><i>getFunction</i></span></td><td><span class="function_parameter_description">
这个函数当观察者检索该变量时调用。
这个函数不带参数返回一个代表监视变量的值。
</span></td></tr>

</table>
</p>



<a name="address"></a><p class="function_definition">
<span class="function_definition">def address( <i></i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
返回内部网络接口的地址。
</div>


<a name="MemoryStream"></a><p class="function_definition">
<span class="function_definition">def MemoryStream( <i></i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
返回一个新的MemoryStream对象。<br>
<br>
MemoryStream对象存储的是二进制信息，提供这个类型是为了让用户能够方便的序列化与反序列化Python基本类型同时能与KBEngine底层序列化规则相同。<br>
<br><br>
例如：你可以使用这个对象构造一个KBEngine能解析的网络数据包。
<br><br>
用法：
<pre>
>>> s = KBEngine.MemoryStream()
>>> s
>>> b''
>>> s.append("UINT32", 1)
>>> s.pop("UINT32")
>>> 1
</pre>
<br><br>
目前MemoryStream能够支持的类型仅为基本数据类型。参考: <a href=../../basetypes.html>基本类型</a>
</div>


<a name="createEntity"></a><p class="function_definition">
<span class="function_definition">def createEntity( <i>entityType, spaceID, position, direction, params</i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
createEntity在当前进程指定space中创建一个新的实体。<br>
这个函数需要指定要创建的实体的类别，位置和方向，还可以选择性地设置实体的任意属性（属性在实体的.def文件里描述）。
<br><br>
例子：

<pre># 创建一个打开的门的实体与"thing"实体的位置一样
direction = ( 0, 0, thing.yaw )
properties = { "open":1 }
<a href="KBEngine.html">KBEngine</a>.<a href=KBEngine.html#createEntity>createEntity</a>( "Door", thing.space, thing.position, direction,
                       properties )
</pre>
</div>

<p>
<span class="function_parameter">参数：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">

<tr valign=top><td><span class="function_parameter_name"><i>entityType</i></span></td><td><span class="function_parameter_description">
string，要创建的实体名称，在<res><a href=../../keywords.html#entities.xml>/scripts/entities.xml</a>文件里声明。
</span></td></tr>

<tr valign=top><td><span class="function_parameter_name"><i>spaceID</i></span></td><td><span class="function_parameter_description">
int32，要放置实体的空间的ID。
</span></td></tr>

<tr valign=top><td><span class="function_parameter_name"><i>position</i></span></td><td><span class="function_parameter_description">
由3个float组成的序列，指定新实体的出生点，在世界中的坐标。
</span></td></tr>

<tr valign=top><td><span class="function_parameter_name"><i>direction</i></span></td><td><span class="function_parameter_description">
由3个float组成的序列，指定新实体的初始朝向(roll, pitch, yaw)，相对于世界坐标系。
</span></td></tr>

<tr valign=top><td><span class="function_parameter_name"><i>params</i></span></td><td><span class="function_parameter_description">
可选参数, 一个Python字典对象。
如果一个指定的键是一个<a href="../Classes/Entity.html">Entity</a>属性，他的值会用来初始化这个<a href="../Classes/Entity.html">Entity</a>实体的属性。
</span></td></tr>

</table>
</p>

<p>
<span class="function_return">返回：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">
<tr><td>
新<a href="../../keywords.html#cn_entity">实体</a>。
</td></tr>
</table>
</p>



<a name="debugTracing"></a><p class="function_definition">
<span class="function_definition">def debugTracing( <i></i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
输出当前KBEngine追踪的Python扩展对象计数器。<br>
扩展对象包括：固定字典、固定数组、Entity、EntityCall...<br>
在服务端正常关闭时如果计数器不为零，此时说明泄露已存在，日志将会输出错误信息。<br><br>
ERROR cellapp [0x0000cd64] [2014-11-12 00:38:07,300] - PyGC::debugTracing(): FixedArray : leaked(128)<br>
ERROR cellapp [0x0000cd64] [2014-11-12 00:38:07,300] - PyGC::debugTracing(): EntityCall : leaked(8)
</div>


<a name="delSpaceData"></a><p class="function_definition">
<span class="function_definition">def delSpaceData( <i>spaceID, key </i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
删除指定key的space数据（如果space分割成多个部分，将进行同步删除）。
<br>
space数据由用户通过<a href=#setSpaceData>setSpaceData</a>设置。
</div>

<p>
<span class="function_parameter">参数：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">

<tr valign=top><td><span class="function_parameter_name"><i>spaceID</i></span></td><td><span class="function_parameter_description">
int32，空间的ID。
</span></td></tr>

<tr valign=top><td><span class="function_parameter_name"><i>key</i></span></td><td><span class="function_parameter_description">
string，一个字符串关键字。
</span></td></tr>
</table>
</p>



<a name="delWatcher"></a><p class="function_definition">
<span class="function_definition">def delWatcher( <i>path</i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
与调试监视系统交互，允许用户在脚本删除监视的变量。
</div>

<p>
<span class="function_parameter">参数：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">

<tr valign=top><td><span class="function_parameter_name"><i>path</i></span></td><td><span class="function_parameter_description">
要删除的变量的路径。
</span></td></tr>

</table>
</p>



<a name="deregisterReadFileDescriptor"></a><p class="function_definition">
<span class="function_definition">def deregisterReadFileDescriptor( <i>fileDescriptor</i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
注销已经通过<a href="KBEngine.html">KBEngine</a>.<a href=KBEngine.html#registerReadFileDescriptor>registerReadFileDescriptor</a>注册的回调。
<br>
<br>
例子:<br>
<a href=http://www.kbengine.org/assets/other/py/Poller.py>http://www.kbengine.org/assets/other/py/Poller.py</a>
</div>

<p>
<span class="function_parameter">参数：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">

<tr valign=top><td><span class="function_parameter_name"><i>fileDescriptor</i></span></td><td><span class="function_parameter_description">
socket描述符/文件描述符。
</span></td></tr>

</table>
</p>

<a name="deregisterWriteFileDescriptor"></a><p class="function_definition">
<span class="function_definition">def deregisterWriteFileDescriptor( <i>fileDescriptor</i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
注销已经通过<a href="KBEngine.html">KBEngine</a>.<a href=KBEngine.html#registerWriteFileDescriptor>registerWriteFileDescriptor</a>注册的回调。
<br>
<br>
例子:<br>
<a href=http://www.kbengine.org/assets/other/py/Poller.py>http://www.kbengine.org/assets/other/py/Poller.py</a>
</div>

<p>
<span class="function_parameter">参数：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">

<tr valign=top><td><span class="function_parameter_name"><i>fileDescriptor</i></span></td><td><span class="function_parameter_description">
socket描述符/文件描述符。
</span></td></tr>

</table>
</p>



<a name="executeRawDatabaseCommand"></a><p class="function_definition">
<span class="function_definition">def executeRawDatabaseCommand( <i>command, callback, threadID, dbInterfaceName</i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
这个脚本函数在数据库上执行原始数据库命令，该命令将直接由相关数据库进行解析。
<br><br>
请注意使用该函数修改实体数据可能不生效，因为如果实体已经检出，被修改过的实体数据将仍会被实体存档而导致覆盖。<br>
强烈不推荐这个函数用于读取或修改实体数据。
</div>

<p>
<span class="function_parameter">参数：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">

<tr valign=top><td><span class="function_parameter_name"><i>command</i></span></td><td><span class="function_parameter_description">
这个数据库命令将会因为不同数据库配置方案而不同。对于方案为MySQL数据库它是一个SQL查询语句。
</span></td></tr>

<tr valign=top><td><span class="function_parameter_name"><i>callback</i></span></td><td><p class="function_parameter_description">可选参数，带有命令执行结果的回调对象（比如说是一个函数）。这个回调带有4个参数：结果集合，影响的行数，自増长值，错误信息。 <br>
  声明样例：<br>
  def 
  sqlcallback(result, rows, insertid, error):<br>
  &nbsp;&nbsp;&nbsp;&nbsp;print(result, rows, insertid, error) <br>
  <br>
  如同上面的例子所示，result参数对应的就是&ldquo;结果集合&rdquo;，这个结果集合参数是一个行列表。
  每一行是一个包含字段值的字符串列表。<br>
  命令执行没有返回结果集合（比如说是DELETE命令），
  或者
  命令执行有错误时这个结果集合为None。 <br>
  <br>
  rows参数则是&ldquo;影响的行数&rdquo;，它是一个整数，表示命令执行受影响的行数。这个参数只和不返回结果结合的命令（如DELETE）相关。<br>
  如果有结果集合返回或者命令执行有错误时这个参数为None。 </p>
    <p class="function_parameter_description">insertid对应的是&ldquo;自増长值&rdquo;，类似于实体的databaseID，当成功的向一张带有自増长类型字段的表中插入数据时，它返回该数据在插入时自増长字段所被赋于的值。<br>
      更多的信息可以参阅mysql的mysql_insert_id()方法。另外，此参数仅在数据库类型为mysql时有意义。<br>
  <br>
  error则对应了&ldquo;错误信息&rdquo;，当命令执行有错误时，这个参数是一个描述错误的字符串。命令执行没有发生错误时这个参数为None。 </p></td></tr>

<tr valign=top><td><span class="function_parameter_name"><i>threadID</i></span></td><td><span class="function_parameter_description">
int32，可选参数，指定一个线程来处理本条命令。用户可以通过这个参数控制某一类命令的执行先后顺序（dbmgr是多线程处理的），默认是不指定，如果threadID是实体的ID，<br>
那么将加入到该实体的存档队列中由线程逐条写入。
</span></td></tr>

<tr valign=top><td><span class="function_parameter_name"><i>dbInterfaceName</i></span></td><td><span class="function_parameter_description">
string，可选参数，指定由某个数据库接口来完成, 默认使用"default"接口。数据库接口由kbengine_defaults.xml->dbmgr->databaseInterfaces中定义。
</span></td></tr>

</table>
</p>



<a name="genUUID64"></a><p class="function_definition">
<span class="function_definition">def genUUID64( <i></i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
该函数生成一个64位的唯一ID。<br>
注意：这个函数依赖于Cellapps服务进程启动参数gus，请正确设置启动参数保持唯一性。<br>
另外如果gus超过65535则该函数只能在当前进程上保持唯一性。
<br>
<br>
用途：<br>
多个服务进程上产生唯一物品ID并且在合服时不会产生冲突。<br>
多个服务进程上产生一个房间ID，不需要进行唯一性校验。<br>
</div>

<p>
<span class="function_return">返回：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">
<tr><td>
返回一个64位的integer。
</td></tr>
</table>
</p>

<a name="getResFullPath"></a><p class="function_definition">
<span class="function_definition">def getResFullPath( <i>res</i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
获取资源的绝对路径。
<br>注意：资源必须在<a href=../../keywords.html#KBE_RES_PATH>KBE_RES_PATH</a>之下才可以访问到。 
</div>

<p>
<span class="function_parameter">参数：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">

<tr valign=top><td><span class="function_parameter_name"><i>res</i></span></td><td><span class="function_parameter_description">
string，如果存在返回资源的绝对路径，否则返回空。
</span></td></tr>

</table>
</p>

<p>
<span class="function_return">返回：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">
<tr><td>
string，资源的绝对路径。
</td></tr>
</table>
</p>



<a name="getSpaceData"></a><p class="function_definition">
<span class="function_definition">def getSpaceData( <i>spaceID, key </i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
获取指定key的space数据。
<br>
space数据由用户通过<a href=#setSpaceData>setSpaceData</a>设置。
</div>

<p>
<span class="function_parameter">参数：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">

<tr valign=top><td><span class="function_parameter_name"><i>spaceID</i></span></td><td><span class="function_parameter_description">
int32，空间的ID。
</span></td></tr>

<tr valign=top><td><span class="function_parameter_name"><i>key</i></span></td><td><span class="function_parameter_description">
string，一个字符串关键字。
</span></td></tr>
</table>
</p>

<p>
<span class="function_return">返回：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">
<tr><td>
string，指定key的字符串数据。
</td></tr>
</table>
</p>


<a name="getSpaceGeometryMapping"></a><p class="function_definition">
<span class="function_definition">def getSpaceGeometryMapping( <i>spaceID</i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
返回一个指定空间的几何映射名称。
</div>

<p>
<span class="function_parameter">参数：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">

<tr valign=top><td><span class="function_parameter_name"><i>spaceID</i></span></td><td><span class="function_parameter_description">
要查询的空间的id。
</span></td></tr>

</table>
</p>

<p>
<span class="function_return">返回：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">
<tr><td>
string，几何映射名称。
</td></tr>
</table>
</p>




<a name="getWatcher"></a><p class="function_definition">
<span class="function_definition">def getWatcher( <i>path</i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
从KBEngine调试系统中获取一个监视变量的值。
<br>
<br>
例子：在baseapp1的Python命令行输入:<br>
>>>KBEngine.getWatcher("/root/stats/runningTime")
<br>
12673648533
<br>
<br>
>>>KBEngine.getWatcher("/root/scripts/players")
<br>
32133
</div>

<p>
<span class="function_parameter">参数：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">

<tr valign=top><td><span class="function_parameter_name"><i>path</i></span></td><td><span class="function_parameter_description">
string，该变量的绝对路径包括变量名(可以在GUIConsole的watcher页查看)。
</span></td></tr>

</table>
</p>

<p>
<span class="function_return">返回：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">
<tr><td>
该变量的值。
</td></tr>
</table>
</p>


<a name="getWatcherDir"></a><p class="function_definition">
<span class="function_definition">def getWatcherDir( <i>path</i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
从KBEngine调试系统中获取一个监视目录下的元素列表(目录、变量名)。
<br>
<br>
例子：在baseapp1的Python命令行输入:<br>
>>>KBEngine.getWatcher("/root")
<br>
('stats', 'objectPools', 'network', 'syspaths', 'ThreadPool', 'cprofiles', 'scripts', 'numProxices', 'componentID', 'componentType', 'uid', 'numClients', 'globalOrder', 'username', 'load', 'gametime', 'entitiesSize', 'groupOrder')
</div>

<p>
<span class="function_parameter">参数：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">

<tr valign=top><td><span class="function_parameter_name"><i>path</i></span></td><td><span class="function_parameter_description">
string，该变量的绝对路径(可以在GUIConsole的watcher页查看)。
</span></td></tr>

</table>
</p>

<p>
<span class="function_return">返回：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">
<tr><td>
监视目录下的元素列表(目录、变量名)。
</td></tr>
</table>
</p>



<a name="getAppFlags"></a><p class="function_definition">
<span class="function_definition">def getAppFlags( <i></i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
获取当前引擎APP的标记, 参考:<a href="KBEngine.html">KBEngine</a>.<a href=KBEngine.html#setAppFlags>setAppFlags</a>。
<br>
</div>

<p>
<span class="function_return">返回：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">
<tr><td>
KBEngine.APP_FLAGS_*。
</td></tr>
</table>
</p>




<a name="hasRes"></a><p class="function_definition">
<span class="function_definition">def hasRes( <i>res</i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
使用这个接口可以判断一个相对路径的资源是否存在。<br>
注意：资源必须在<a href=../../keywords.html#KBE_RES_PATH>KBE_RES_PATH</a>之下才可以访问到。
<br>
<br>
例子:
<br>
<br>
>>>KBEngine.hasRes("<a href=../../keywords.html#entities.xml>scripts/entities.xml</a>")
<br>
True
</div>

<p>
<span class="function_parameter">参数：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">

<tr valign=top><td><span class="function_parameter_name"><i>res</i></span></td><td><span class="function_parameter_description">
string，资源的相对路径。
</span></td></tr>
</table>
</p>

<p>
<span class="function_return">返回：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">
<tr><td>
BOOL, 存在返回True，否则返回False。
</td></tr>
</table>
</p>


<a name="isShuttingDown"></a><p class="function_definition">
<span class="function_definition">def isShuttingDown( <i></i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
返回服务端是否正在关闭中。在onBaseAppShuttingDown回调函数被调用后，这个函数返回True。
</div>

<p>
<span class="function_return">返回：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">
<tr><td>
系统正在关闭返回True，否则返回False。
</td></tr>
</table>
</p>



<a name="listPathRes"></a><p class="function_definition">
<span class="function_definition">def listPathRes( <i>path, extension</i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
获得一个资源目录下的资源列表。<br>
注意：资源必须在<a href=../../keywords.html#KBE_RES_PATH>KBE_RES_PATH</a>之下才可以访问到。
<br>
<br>
例子:
<br>
<br>
>>>KBEngine.listPathRes("scripts/cell/interfaces")
<br>
('/home/kbe/kbengine/demo/res/scripts/cell/interfaces/AI.py', '/home/kbe/kbengine/demo/res/scripts/cell/interfaces/新建文本文档.txt')
<br><br>
>>>KBEngine.listPathRes("scripts/cell/interfaces", "txt")
<br>
('/home/kbe/kbengine/demo/res/scripts/cell/interfaces/新建文本文档.txt')
<br><br>
>>>KBEngine.listPathRes("scripts/cell/interfaces", "txt|py")
<br>
('/home/kbe/kbengine/demo/res/scripts/cell/interfaces/AI.py', '/home/kbe/kbengine/demo/res/scripts/cell/interfaces/新建文本文档.txt')
<br><br>
>>>KBEngine.listPathRes("scripts/cell/interfaces", ("txt", "py"))
<br>
('/home/kbe/kbengine/demo/res/scripts/cell/interfaces/AI.py', '/home/kbe/kbengine/demo/res/scripts/cell/interfaces/新建文本文档.txt')
</div>

<p>
<span class="function_parameter">参数：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">

<tr valign=top><td><span class="function_parameter_name"><i>res</i></span></td><td><span class="function_parameter_description">
string，资源的相对路径。
</span></td></tr>

<tr valign=top><td><span class="function_parameter_name"><i>extension</i></span></td><td><span class="function_parameter_description">
string，可选参数，扩展名。
</span></td></tr>
</table>
</p>

<p>
<span class="function_return">返回：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">
<tr><td>
Tuple, 资源列表。
</td></tr>
</table>
</p>



<a name="matchPath"></a><p class="function_definition">
<span class="function_definition">def matchPath( <i>res</i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
使用相对路径的资源获得资源的绝对路径。<br>
注意：资源必须在<a href=../../keywords.html#KBE_RES_PATH>KBE_RES_PATH</a>之下才可以访问到。
<br>
<br>
例子:
<br>
<br>
>>>KBEngine.matchPath("scripts/entities.xml")<br>
'/home/kbe/kbengine/demo/res/scripts/entities.xml'
</div>

<p>
<span class="function_parameter">参数：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">

<tr valign=top><td><span class="function_parameter_name"><i>res</i></span></td><td><span class="function_parameter_description">
string，资源的相对路径(包括资源名称)。
</span></td></tr>
</table>
</p>

<p>
<span class="function_return">返回：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">
<tr><td>
string, 资源的绝对路径。
</td></tr>
</table>
</p>



<a name="open"></a><p class="function_definition">
<span class="function_definition">def open( <i>res, mode, encoding</i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
使用这个接口可以使用相对路径来打开相关资源。
注意：资源必须在<a href=../../keywords.html#KBE_RES_PATH>KBE_RES_PATH</a>之下才可以访问到。
</div>

<p>
<span class="function_parameter">参数：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">

<tr valign=top><td><span class="function_parameter_name"><i>res</i></span></td><td><span class="function_parameter_description">
string，资源的相对路径。
</span></td></tr>

<tr valign=top><td><span class="function_parameter_name"><i>mode</i></span></td><td><span class="function_parameter_description">
string，可选参数，默认值是'r'，文件操作模式：<br>
r     以只读方式打开，<br>
w     以写方式打开，<br>
a     以追加模式打开 (从 EOF 开始, 必要时创建新文件)<br>
r+     以读写模式打开<br>
w+     以读写模式打开 (参见 w )<br>
a+     以读写模式打开 (参见 a )<br>
rb     以二进制读模式打开<br>
wb     以二进制写模式打开 (参见 w )<br>
ab     以二进制追加模式打开 (参见 a )<br>
rb+    以二进制读写模式打开 (参见 r+ )<br>
wb+    以二进制读写模式打开 (参见 w+ )<br>
ab+    以二进制读写模式打开 (参见 a+ )<br>
</span></td></tr>

<tr valign=top><td><span class="function_parameter_name"><i>encoding</i></span></td><td><span class="function_parameter_description">
string，可选参数，用于解码或编码文件的编码的名称，默认编码与平台相关。
</span></td></tr>

</table>
</p>

<a name="publish"></a><p class="function_definition">
<span class="function_definition">def publish( <i></i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
这个接口返回当前服务端发行模式。
</div>

<p>
<span class="function_return">返回：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">
<tr><td>
int8，0：debug，1：release，其它可自定义。
</td></tr>
</table>
</p>



<a name="raycast"></a><p class="function_definition">
<span class="function_definition">def raycast( <i>spaceID, layer, src, dst</i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
在指定的space中指定的layer中由源坐标向目的坐标射出一道射线，返回碰撞到的坐标点。
<br><br>
注意：space必须使用<a href=#addSpaceGeometryMapping>addSpaceGeometryMapping</a>加载过几何数据。
<br><br>
下面是一个例子:
<br><br>

<pre>	>>> KBEngine.raycast( spaceID, entity.layer, (0, 10, 0), (0,-10,0) )
	((0.0000, 0.0000, 0.0000), ( (0.0000, 0.0000, 0.0000),
	(4.0000, 0.0000, 0.0000), (4.0000, 0.0000, 4.0000)), 0)
</pre>
</div>

<p>
<span class="function_parameter">参数：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">

<tr valign=top><td><span class="function_parameter_name"><i>spaceID</i></span></td><td><span class="function_parameter_description">
int32, space的id。
</span></td></tr>

<tr valign=top><td><span class="function_parameter_name"><i>layer</i></span></td><td><span class="function_parameter_description">
int8，几何层。一个space可以同时加载多个navmesh数据，不同的navmesh在不同的layer中，不同的layer可被抽象成地面、水面等等。
</span></td></tr>

</table>
</p>

<p>
<span class="function_return">返回：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">
<tr><td>list， 碰撞到的坐标点列表。
</td></tr>
</table>
</p>



<a name="registerReadFileDescriptor"></a><p class="function_definition">
<span class="function_definition">def registerReadFileDescriptor( <i>fileDescriptor, callback</i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
注册一个回调函数，这个回调函数当文件描述符可读时被调用。
<br>
<br>
例子:<br>
<a href=http://www.kbengine.org/assets/other/py/Poller.py>http://www.kbengine.org/assets/other/py/Poller.py</a>
</div>

<p>
<span class="function_parameter">参数：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">

<tr valign=top><td><span class="function_parameter_name"><i>fileDescriptor</i></span></td><td><span class="function_parameter_description">
socket描述符/文件描述符。
</span></td></tr>

<tr valign=top><td><span class="function_parameter_name"><i>callback</i></span></td><td><span class="function_parameter_description">
一个回调函数，socket描述符/文件描述符作为它的唯一参数。
</span></td></tr>

</table>
</p>

<a name="registerWriteFileDescriptor"></a><p class="function_definition">
<span class="function_definition">
def registerWriteFileDescriptor( <i>fileDescriptor, callback</i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
注册一个回调函数，这个回调函数当socket描述符/文件描述符可写时被调用。
<br>
<br>
例子:<br>
<a href=http://www.kbengine.org/assets/other/py/Poller.py>http://www.kbengine.org/assets/other/py/Poller.py</a>
</div>

<p>
<span class="function_parameter">参数：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">

<tr valign=top><td><span class="function_parameter_name"><i>fileDescriptor</i></span></td><td><span class="function_parameter_description">
socket描述符/文件描述符。
</span></td></tr>

<tr valign=top><td><span class="function_parameter_name"><i>callback</i></span></td><td><span class="function_parameter_description">
一个回调函数，socket描述符/文件描述符作为它的唯一参数。
</span></td></tr>

</table>
</p>



<a name="reloadScript"></a><p class="function_definition">
<span class="function_definition">def reloadScript( <i>fullReload</i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
重新加载与实体和自定义数据类型相关的Python模块。当前实体类会设置为新加载的类。
这个方法应该只用于开发模式，对于产品模式不合适。下面几点应该注意：
<br><br>
1）重载脚本仅仅能在<a href="../index.html">Cellapp</a>上执行， 用户应该确保所有的服务端组件加载完成。
<br><br>
2）自定义类型在脚本重载后应该确保内存中已经实例化的对象也被更新，下面是一个例子:
<br><br>

<pre>for e in <a href="KBEngine.html">KBEngine</a>.<a href=KBEngine.html#entities>entities</a>.values():
   if type( e ) is Avatar.Avatar:
      e.customData.__class__ = CustomClass
</pre>
当这个方法完成时 <a href="KBEngine.html">KBEngine</a>.<a href=KBEngine.html#onInit>onInit</a>( True ) 被调用。
</div>

<p>
<span class="function_parameter">参数：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">

<tr valign=top><td><span class="function_parameter_name"><i>fullReload</i></span></td><td><span class="function_parameter_description">
可选的boolean参数，指定是否同时重新加载实体定义。如果这个参数为False，则实体定义不会被重新加载。默认为True。
</span></td></tr>

</table>
</p>

<p>
<span class="function_return">返回：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">
<tr><td>重新加载成功返回True，否则返回False。
</td></tr>
</table>
</p>



<a name="scriptLogType"></a><p class="function_definition">
<span class="function_definition">def scriptLogType( <i>logType</i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
设置当前Python.print输出的信息类型(参考: KBEngine.LOG_TYPE_*)。
</div>



<a name="setAppFlags"></a><p class="function_definition">
<span class="function_definition">def setAppFlags( <i>flags</i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
设置当前引擎APP的标记。
<br>
<br>
KBEngine.APP_FLAGS_NONE // 默认的(未设置标记)<br>
KBEngine.APP_FLAGS_NOT_PARTCIPATING_LOAD_BALANCING //不参与负载均衡<br>
<br>
例如：<br>
KBEngine.setAppFlags(KBEngine.APP_FLAGS_NOT_PARTCIPATING_LOAD_BALANCING | KBEngine.APP_FLAGS_*)
</div>



<a name="setSpaceData"></a><p class="function_definition">
<span class="function_definition">def setSpaceData( <i>spaceID, key, value </i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
设置指定key的space数据。
<br>
space数据可以通过<a href=#getSpaceData>getSpaceData</a>获取。
</div>

<p>
<span class="function_parameter">参数：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">

<tr valign=top><td><span class="function_parameter_name"><i>spaceID</i></span></td><td><span class="function_parameter_description">
int32，空间的ID。
</span></td></tr>

<tr valign=top><td><span class="function_parameter_name"><i>key</i></span></td><td><span class="function_parameter_description">
string，一个字符串关键字。
</span></td></tr>

<tr valign=top><td><span class="function_parameter_name"><i>value</i></span></td><td><span class="function_parameter_description">
string，字符串值。
</span></td></tr>
</table>

</table>
</p>


<a name="time"></a><p class="function_definition">
<span class="function_definition">def time( <i></i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
这个方法返回当前游戏的时间（周期数）。
</div>

<p>
<span class="function_return">返回：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">
<tr><td>
uint32，当前游戏的时间，这里指周期数，周期受频率影响，频率由配置文件<a href=../../keywords.html#kbengine.xml>kbengine.xml</a>或者<a href=../../keywords.html#kbengine_defaults.xml>kbengine_defaults.xml</a>->gameUpdateHertz决定。
</td></tr>
</table>
</p>



<a name="urlopen"></a><p class="function_definition">
<span class="function_definition">def urlopen( <i>url, callback, postData, headers</i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
这个脚本函数在提供对外HTTP/HTTPS异步请求。
</div>

<p>
<span class="function_parameter">参数：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">

<tr valign=top><td><span class="function_parameter_name"><i>url</i></span></td><td><span class="function_parameter_description">
有效的HTTP/HTTPS网址，字符串类型。
</span></td></tr>

<tr valign=top><td><span class="function_parameter_name"><i>callback</i></span></td>
<td><p class="function_parameter_description">
可选参数，带有请求执行结果的回调对象（比如说是一个函数）。这个回调带有5个参数：HTTP请求返回码（如：200)，返回的内容，返回的HTTP协议头，是否成功，请求的网址。
<br>
声明样例：<br>
def 
onHttpCallback(httpcode, data, headers, success, url):<br>
&nbsp;&nbsp;&nbsp;&nbsp;print(httpcode, data, headers, success, url)  <br>
<br>
如同上面的例子所示:
<br><p class="function_parameter_description"></p>httpcode:参数对应的就是&ldquo;HTTP请求返回码&rdquo;，这个结果集合参数是一个整形值。
<p class="function_parameter_description"></p>data:参数则是&ldquo;返回的内容&rdquo;，它是一个字符串。
</p>
<p class="function_parameter_description">headers:参数是&ldquo;服务器返回的HTTP协议头&rdquo;，如：{"Content-Type": "application/x-www-form-urlencoded"}，它是一个字典。
<p class="function_parameter_description"></p>success:则对应了&ldquo;执行是否成功&rdquo;，当请求执行有错误时，为False，可以通过httpcode进一步判断错误信息。
</p>
<p class="function_parameter_description">url:是&ldquo;请求所用的网址。
</p>
</td></tr>

<tr valign=top><td><span class="function_parameter_name"><i>postData</i></span></td><td><span class="function_parameter_description">
可选参数，默认是GET方式请求服务器，如果需要POST方式请提供需要POST的内容，引擎将自动使用POST方式请求服务器，它是一个bytes。
</span></td></tr>

<tr valign=top><td><span class="function_parameter_name"><i>headers</i></span></td><td><span class="function_parameter_description">
可选参数，请求时使用的HTTP头，如：{"Content-Type": "application/x-www-form-urlencoded"}，它是一个字典。
</span></td></tr>

</table>
</p>



<hr>
<h2>回调函数文档</h2>

<a name="onCellAppData"></a><p class="function_definition">
<span class="function_definition">def onCellAppData( <i>key, value</i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
KBEngine.cellAppData有改变时回调此函数。
<br>注意：该回调接口必须实现在入口模块(<a href=../../keywords.html#kbengine_defaults.xml>kbengine_defaults.xml</a>->entryScriptFile)中。
</div>

<p>
<span class="function_parameter">参数：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">

<tr valign=top><td><span class="function_parameter_name"><i>key</i></span></td><td><span class="function_parameter_description">
被改变数据的键。
</span></td></tr>

<tr valign=top><td><span class="function_parameter_name"><i>value</i></span></td><td><span class="function_parameter_description">
被改变数据的值。
</span></td></tr>

</table>
</p>

<a name="onCellAppDataDel"></a><p class="function_definition">
<span class="function_definition">def onCellAppDataDel( <i>key</i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
KBEngine.cellAppData有删除的时候回调此函数。
<br>注意：该回调接口必须实现在入口模块(<a href=../../keywords.html#kbengine_defaults.xml>kbengine_defaults.xml</a>->entryScriptFile)中。
</div>

<p>
<span class="function_parameter">参数：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">

<tr valign=top><td><span class="function_parameter_name"><i>key</i></span></td><td><span class="function_parameter_description">
被删除数据的键。
</span></td></tr>

</table>
</p>

<a name="onGlobalData"></a><p class="function_definition">
<span class="function_definition">def onGlobalData( <i>key, value</i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
KBEngine.globalData有改变的时候回调此函数。
<br>注意：该回调接口必须实现在入口模块(<a href=../../keywords.html#kbengine_defaults.xml>kbengine_defaults.xml</a>->entryScriptFile)中。
</div>

<p>
<span class="function_parameter">参数：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">

<tr valign=top><td><span class="function_parameter_name"><i>key</i></span></td><td><span class="function_parameter_description">
被改变数据的键。
</span></td></tr>

<tr valign=top><td><span class="function_parameter_name"><i>value</i></span></td><td><span class="function_parameter_description">
被改变数据的值。
</span></td></tr>

</table>
</p>

<a name="onGlobalDataDel"></a><p class="function_definition">
<span class="function_definition">def onGlobalDataDel( <i>key</i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
KBEngine.globalData有删除的时候回调此函数。
<br>注意：该回调接口必须实现在入口模块(<a href=../../keywords.html#kbengine_defaults.xml>kbengine_defaults.xml</a>->entryScriptFile)中。
</div>

<p>
<span class="function_parameter">参数：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">

<tr valign=top><td><span class="function_parameter_name"><i>key</i></span></td><td><span class="function_parameter_description">
被删除数据的键。
</span></td></tr>

</table>
</p>

<a name="onInit"></a><p class="function_definition">
<span class="function_definition">def onInit( <i>isReload</i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
当引擎启动后初始化完所有的脚本后这个接口被调用。
<br>注意：该回调接口必须实现在入口模块(<a href=../../keywords.html#kbengine_defaults.xml>kbengine_defaults.xml</a>->entryScriptFile)中。
</div>

<p>
<span class="function_parameter">参数：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">

<tr valign=top><td><span class="function_parameter_name"><i>isReload</i></span></td><td><span class="function_parameter_description">
bool，是否是被重写加载脚本后触发的。
</span></td></tr>

</table>
</p>

<a name="onSpaceData"></a><p class="function_definition">
<span class="function_definition">def onSpaceData( <i>spaceID, key, value</i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
当space数据有改变的时候被调用。<br>
space数据由用户通过<a href=#setSpaceData>setSpaceData</a>设置。
</div>

<p>
<span class="function_parameter">参数：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">

<tr valign=top><td><span class="function_parameter_name"><i>spaceID</i></span></td><td><span class="function_parameter_description">
空间的ID。
</span></td></tr>

<tr valign=top><td><span class="function_parameter_name"><i>key</i></span></td><td><span class="function_parameter_description">
被改变数据的键。
</span></td></tr>

<tr valign=top><td><span class="function_parameter_name"><i>value</i></span></td><td><span class="function_parameter_description">
被改变数据的值。
</span></td></tr>

</table>
</p>

</table>
</p>


<a name="onSpaceGeometryLoaded"></a><p class="function_definition">
<span class="function_definition">def onSpaceGeometryLoaded( <i>spaceID, mapping</i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
空间所需求的网格碰撞等数据加载完毕。<br>
由用户通过<a href=#addSpaceGeometryMapping>addSpaceGeometryMapping</a>设置。
</div>

<p>
<span class="function_parameter">参数：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">

<tr valign=top><td><span class="function_parameter_name"><i>spaceID</i></span></td><td><span class="function_parameter_description">
空间的ID。
</span></td></tr>

<tr valign=top><td><span class="function_parameter_name"><i>mapping</i></span></td><td><span class="function_parameter_description">
网格碰撞数据的映射值。
</span></td></tr>

</table>
</p>

</table>
</p>



<a name="onAllSpaceGeometryLoaded"></a><p class="function_definition">
<span class="function_definition">def onAllSpaceGeometryLoaded( <i>spaceID, isBootstrap, mapping</i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
空间所需求的网格碰撞等数据全部加载完毕。<br>
由用户通过<a href=#addSpaceGeometryMapping>addSpaceGeometryMapping</a>设置。
</div>

<p>
<span class="function_parameter">参数：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">

<tr valign=top><td><span class="function_parameter_name"><i>spaceID</i></span></td><td><span class="function_parameter_description">
空间的ID。
</span></td></tr>

<tr valign=top><td><span class="function_parameter_name"><i>isBootstrap</i></span></td><td><span class="function_parameter_description">
如果一个空间被分割由多个cell共同负载，那么isBootstrap描述的是是否为加载请求的发起cell。
</span></td></tr>

<tr valign=top><td><span class="function_parameter_name"><i>mapping</i></span></td><td><span class="function_parameter_description">
网格碰撞数据的映射值。
</span></td></tr>

</table>
</p>

</table>
</p>

<a name="onReadyForLogin"></a><p class="function_definition">
<span class="function_definition">def onReadyForLogin( <i>isBootstrap</i> ):</span>
</p>

<div class="function_description">
<b>功能说明：</b><br><br>
当引擎启动并初始化完成后会一直调用此接口询问脚本层是否准备完毕，如果脚本层准备完毕则loginapp允许客户端登录。
<br>注意：该回调接口必须实现在入口模块(<a href=../../keywords.html#kbengine_defaults.xml>kbengine_defaults.xml</a>->entryScriptFile)中。
</div>

<p>
<span class="function_parameter">参数：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">

<tr valign=top><td><span class="function_parameter_name"><i>isBootstrap</i></span></td><td><span class="function_parameter_description">
bool，是否为第一个启动的<a href="../index.html">Cellapp</a>。
</span></td></tr>

</table>
</p>

<p>
<span class="function_return">返回：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">
<tr><td>返回值大于等于1.0则脚本层准备完成，否则返回准备的进度值0.0~1.0。
</td></tr>
</table>
</p>



<hr>
<h2>属性文档</h2>

<a name="LOG_TYPE_DBG"></a><p class="attribute_definition">
<span class="attribute_definition">LOG_TYPE_DBG</span>
</p>

<div class="attribute_description">
<b>说明：</b><br><br>
日志输出类型为调试类型。<br>
由<a href=#scriptLogType>scriptLogType</a>设置。
</div>

<a name="LOG_TYPE_ERR"></a><p class="attribute_definition">
<span class="attribute_definition">LOG_TYPE_ERR</span>
</p>

<div class="attribute_description">
<b>说明：</b><br><br>
日志输出类型为错误类型。<br>
由<a href=#scriptLogType>scriptLogType</a>设置。
</div>

<a name="LOG_TYPE_INFO"></a><p class="attribute_definition">
<span class="attribute_definition">LOG_TYPE_INFO</span>
</p>

<div class="attribute_description">
<b>说明：</b><br><br>
日志输出类型为常规信息类型。<br>
由<a href=#scriptLogType>scriptLogType</a>设置。
</div>

<a name="LOG_TYPE_NORMAL"></a><p class="attribute_definition">
<span class="attribute_definition">LOG_TYPE_NORMAL</span>
</p>

<div class="attribute_description">
<b>说明：</b><br><br>
日志输出类型为常规类型。<br>
由<a href=#scriptLogType>scriptLogType</a>设置。
</div>

<a name="LOG_TYPE_WAR"></a><p class="attribute_definition">
<span class="attribute_definition">LOG_TYPE_WAR</span>
</p>

<div class="attribute_description">
<b>说明：</b><br><br>
日志输出类型为警告类型。<br>
由<a href=#scriptLogType>scriptLogType</a>设置。
</div>

<a name="NEXT_ONLY"></a><p class="attribute_definition">
<span class="attribute_definition">NEXT_ONLY</span>
</p>

<div class="attribute_description">
<b>说明：</b><br><br>
这个常量目前在Cellapp未被使用。
</div>

<a name="cellAppData"></a><p class="attribute_definition">
<span class="attribute_definition">cellAppData</span>
</p>

<div class="attribute_description">
<b>说明：</b><br><br>
这个属性包含一个类字典的对象，这个对象会在所有的CellApps之间自动同步。
当字典的一个值被修改，这个修改会广播到所有的CellApps。

<br><br>
例子：

<pre><a href="KBEngine.html">KBEngine</a>.<a href=KBEngine.html#cellAppData>cellAppData</a>[ "hello" ] = "there"
</pre>
<br><br>
其余CellApp可以访问下面的：

<pre>print <a href="KBEngine.html">KBEngine</a>.<a href=KBEngine.html#cellAppData>cellAppData</a>[ "hello" ]
</pre>
<br><br>
键和值可以是任意类型，但这些类型必须在所有目标组件上能够被封装和被拆封。
<br><br>
当一个值被改变或被删除，一个回调函数会在所有组件被调用。
参看：<a href="KBEngine.html">KBEngine</a>.<a href=KBEngine.html#onCellAppData>onCellAppData</a>和<a href="KBEngine.html">KBEngine</a>.<a href=KBEngine.html#onDelCellAppData>onDelCellAppData</a>。
<br><br>
注意：只有顶层的值才会被广播，如果你有一个值（比如一个列表），它改变了内部的值（比如只是改变一个数），这个信息不会被广播。
<br><br>
不要进行下面的操作：

<pre><a href="KBEngine.html">KBEngine</a>.<a href=KBEngine.html#cellAppData>cellAppData</a>[ "list" ] = [1, 2, 3]
<a href="KBEngine.html">KBEngine</a>.<a href=KBEngine.html#cellAppData>cellAppData</a>[ "list" ][1] = 7
</pre>
这样，本地访问是[1, 7, 3]，远程访问是[1, 2, 3]。
</div>

<a name="component"></a><p class="attribute_definition">
<span class="attribute_definition">component</span>
</p>

<div class="attribute_description">
<b>说明：</b><br><br>
这是正运行在当前Python环境的组件。（至今为止）可能值有'cellapp', 'baseapp', 'client', 'dbmgr', 'bots' 和 'editor'。
</div>

<a name="entities"></a><p class="attribute_definition">
<span class="attribute_definition">entities</span>
</p>

<div class="attribute_description">
<b>说明：</b><br><br>
entities是一个字典对象，包含当前进程上所有的实体，包括<a href=../../keywords.html#ghost>ghost</a>实体。<br>
<br>
调试泄露的实体（调用过destroy却没有释放内存的实体，通常是由于被引用导致无法释放）：<br>
<pre>
>>> KBEngine.entities.garbages.items()
[(1025, Avatar object at 0x7f92431ceae8.)]
<br>
>>> e = _[0][1]
>>> import gc
>>> gc.get_referents(e)
[{'spacesIsOk': True, 'bootstrapIdx': 1}, <class 'Avatar.Avatar'>]
</pre>
<br>
调试泄露的KBEngine封装的Python对象：<br>
<a href=#debugTracing>KBEngine.debugTracing</a>
</div>

<p>
<span class="attribute_type">类型：</span>
<table border=0 cellpadding=0 cellspacing=3 style="margin-left: 20px;">
<tr><td><a href="Entities.html">Entities</a>
</td></tr>
</table>
</p>

<a name="globalData"></a><p class="attribute_definition">
<span class="attribute_definition">globalData</span>
</p>

<div class="attribute_description">
<b>说明：</b><br><br>
这个属性包含一个类字典的对象，这个对象会在所有的BaseApps和CellApps之间自动复制。
当字典的一个值被修改，这个修改会广播到所有的BaseApps和CellApps。CellAppMgr解决竞争条件，保证信息复制的权威性。
<br><br>
例子：

<pre><a href="KBEngine.html">KBEngine</a>.<a href=KBEngine.html#globalData>globalData</a>[ "hello" ] = "there"
</pre>
<br><br>
其余<a href="../index.html">Cellapp</a>或者<a href="../index.html"><a href="../../baseapp/index.html">Baseapp</a></a>可以访问下面的：

<pre>print <a href="KBEngine.html">KBEngine</a>.<a href=KBEngine.html#globalData>globalData</a>[ "hello" ]
</pre>
<br><br>
键和值可以是任意类型，但这些类型必须在所有目标组件上能够被封装和被拆封。
<br><br>
当一个值被改变或被删除，一个回调函数会在所有组件被调用。
参看：<a href="KBEngine.html">KBEngine</a>.<a href=KBEngine.html#onGlobalData>onGlobalData</a>和<a href="KBEngine.html">KBEngine</a>.<a href=KBEngine.html#onGlobalDataDel>onGlobalDataDel</a>。
<br><br>
注意：只有顶层的值才会被广播，如果你有一个易变的值（比如一个列表），它改变了内部的值（比如只是改变一个数），这个信息不会被广播。
<br><br>
不要进行下面的操作：

<pre><a href="KBEngine.html">KBEngine</a>.<a href=KBEngine.html#globalData>globalData</a>[ "list" ] = [1, 2, 3]
<a href="KBEngine.html">KBEngine</a>.<a href=KBEngine.html#globalData>globalData</a>[ "list" ][1] = 7
</pre>
这样，本地访问是[1, 7, 3]，远程访问是[1, 2, 3]。
</div>

<hr>
<p class="copyrightFooter">版权归KBEngine所有。</p>
</body>
</html>